import type { App } from 'vue'
import { isDependencyInstalled, isElementPlusRegistered as checkElementPlusRegistered, isElementPlusRegisteredInApp, isElementPlusRegisteredGlobally } from './dependency-check'

// 记录是否已尝试注册Element Plus组件
let hasTriedToRegisterElementPlusComponents = false

/**
 * 尝试导入并注册Element Plus组件
 * @param app Vue应用实例
 * @returns 是否成功注册
 */
export async function tryRegisterElementPlus(app: App): Promise<boolean> {
  // 如果已经注册过，直接返回
  if (hasTriedToRegisterElementPlusComponents) {
    return true
  }
  
  // 如果已经检测到Element Plus被注册，不再重复注册
  if (checkElementPlusRegistered()) {
    hasTriedToRegisterElementPlusComponents = true
    return true
  }
  
  try {
    // 尝试动态导入Element Plus
    const ElementPlus = await import('element-plus')
    if (ElementPlus && ElementPlus.default) {
      app.use(ElementPlus.default)
      
      // 尝试导入Element Plus图标
      try {
        const icons = await import('@element-plus/icons-vue')
        if (icons) {
          // 注册所有图标组件
          for (const [key, component] of Object.entries(icons)) {
            app.component(key, component)
          }
        }
      } catch (iconError) {
        console.warn('[EpmsElement] Failed to register Element Plus icons:', iconError)
      }
      
      hasTriedToRegisterElementPlusComponents = true
      return true
    }
  } catch (error) {
    console.error('[EpmsElement] Failed to register Element Plus:', error)
    return false
  }
  
  return false
}

/**
 * Element Plus组件名到实际组件的映射
 */
interface ElementPlusComponents {
  [key: string]: any;
}

/**
 * 为单个组件确保Element Plus依赖
 * 这个函数可以在组件内调用，确保组件使用的Element Plus组件可用
 * @param app Vue应用实例
 * @param requiredComponents 需要的Element Plus组件名称列表
 */
export async function ensureElementPlusForComponent(
  app: App, 
  requiredComponents: string[] = []
): Promise<void> {
  // 如果已经注册过或者检测到已存在，不再处理
  if (hasTriedToRegisterElementPlusComponents || checkElementPlusRegistered()) {
    return
  }
  
  try {
    // 尝试从Element Plus按需导入组件
    const ElementPlus = await import('element-plus')
    
    if (ElementPlus) {
      // 如果提供了具体组件列表，则只注册需要的组件
      if (requiredComponents.length > 0) {
        for (const componentName of requiredComponents) {
          // 获取组件，使用类型转换解决TypeScript索引签名问题
          const component = (ElementPlus as unknown as ElementPlusComponents)[componentName]
          if (component) {
            app.use(component)
          } else {
            console.warn(`[EpmsElement] Element Plus component not found: ${componentName}`)
          }
        }
      }
    }
  } catch (error) {
    console.error('[EpmsElement] Failed to register required Element Plus components:', error)
  }
}

/**
 * 检查组件是否已在应用中注册
 * @param app Vue应用实例
 * @param componentName 组件名称
 */
export function isComponentRegistered(app: App, componentName: string): boolean {
  return componentName in (app as any)._context.components
}

/**
 * Element Plus 检测和注册冲突处理工具
 * 用于解决在微前端环境下可能出现的Element Plus重复注册问题
 */

/**
 * 检查Element Plus是否已安装
 * @returns 是否已安装
 */
export function isElementPlusInstalled(): boolean {
  return isDependencyInstalled('element-plus')
}

/**
 * 检查Element Plus是否已注册
 * @param app Vue应用实例（可选）
 * @returns 是否已注册
 */
export function isElementPlusRegistered(app?: App): boolean {
  return checkElementPlusRegistered(app)
}

/**
 * 处理Element Plus冲突
 * 根据不同情况选择合适的处理策略
 * @param app Vue应用实例
 * @returns 处理策略 
 *   - 'register': 需要注册Element Plus
 *   - 'skip': 跳过注册
 *   - 'error': 出现错误，无法处理
 */
export function handleElementPlusConflict(app: App): 'register' | 'skip' | 'error' {
  try {
    // 首先检查Element Plus是否已安装
    if (!isElementPlusInstalled()) {
      console.error('[EPMS Element] Element Plus is not installed. Please install it first.')
      return 'error'
    }
    
    // 检查是否已在当前应用中注册
    if (isElementPlusRegistered(app)) {
      console.info('[EPMS Element] Element Plus is already registered in the current app. Skipping registration.')
      return 'skip'
    }
    
    // 检查是否已全局注册
    if (isElementPlusRegisteredGlobally()) {
      console.warn('[EPMS Element] Element Plus appears to be registered globally. This may cause conflicts.')
      // 在微前端环境下，我们仍然选择跳过注册
      return 'skip'
    }
    
    // 未检测到注册，需要注册
    return 'register'
  } catch (error) {
    console.error('[EPMS Element] Error checking Element Plus registration:', error)
    // 出错时保守处理，尝试注册
    return 'register'
  }
}

/**
 * 安全注册Element Plus
 * 仅在需要时注册，避免冲突
 * @param app Vue应用实例
 * @param ElementPlus Element Plus模块
 * @returns 是否成功注册
 */
export function safeRegisterElementPlus(app: App, ElementPlus: any): boolean {
  const strategy = handleElementPlusConflict(app)
  
  switch (strategy) {
    case 'register':
      try {
        app.use(ElementPlus)
        console.info('[EPMS Element] Element Plus registered successfully.')
        return true
      } catch (error) {
        console.error('[EPMS Element] Failed to register Element Plus:', error)
        return false
      }
    case 'skip':
      console.info('[EPMS Element] Skipped Element Plus registration to avoid conflicts.')
      return true
    case 'error':
      console.error('[EPMS Element] Cannot register Element Plus due to errors.')
      return false
    default:
      return false
  }
} 